import bwPowerSet from '@/vendor/power-set'
// 演示bwPowerSet 使用
// console.log(bwPowerSet(['蓝色', '10cm', '中国']))
// 封装一个方法，根据goods.sku去整理路径字典
// 定义一个分隔符
const spliter = '☆'
const getPathMap = (skus) => {
  // console.log(skus)
  const pathMap = {}
  // 1. 过滤出有库存的 有效的sku，即inventory（库存）不为0
  // filter 返回还是数组，可以链式调用
  skus.filter(sku => sku.inventory > 0)
    .forEach(sku => {
      // console.log(sku)
      // 2. 找到符合条件的sku，进行数据处理,将valueName（展示的选项）提取到一个数组中
      const arr = sku.specs.map(item => item.valueName)
      //  3. 使用算法求子集 => 所有可以选择的选项
      const list = bwPowerSet(arr)
      // console.log(list)
      //  4. 整理子集，组合字典
      list.forEach(item => {
        // 设置字典的属性值，将所有子集拼接成字符串，做key
        const key = item.join(spliter)
        // console.log('key', key)
        // [sku.id] 相当于 pathMap[key] = []  pathMap[key].push(sku.id)
        // 当pahtMap没有key值时，新建一个属性，key:[id]  如果有key值时，直接push(id)
        if (pathMap[key]) {
          pathMap[key].push(sku.id)
        } else {
          pathMap[key] = [sku.id]
        }
      })
    })
  return pathMap
}
// 判断是否可以点击
/**
 *
 * 核心逻辑：遍历按钮，判断是否在字典里
 * 初始化的时候，判断单个按钮就行
 * 点击之后，需要组合起来判断是否在字典里
 */
const updateDisabledStatus = (specs, pathMap) => {
  // 引用类型备份，最好JSON.stringify（）深拷贝一下
  const selectedJSON = JSON.stringify(getSelectedSpec(specs))
  // selectedJSON 是备份之后已经点击的按钮的组合
  // console.log('JSON', selectedJSON)
  // 遍历获取每一行的按钮
  // console.log(specs.values)
  // i 是代表每一行按钮
  specs.forEach((spec, i) => {
    // 遍历获取到每一个按钮 如果没有选中，判断单个按钮是否在字典里
    // 一旦有选中的，就需要把将要选中的项，和已选中的组合
    // spec.values是每一行按钮
    spec.values.forEach(btn => {
      // console.log(btn.name)
      const selectedArr = JSON.parse(selectedJSON)
      // key是 统计的是下一次可能点击的按钮赋值 [undefined,'20com','中国']之后可能会点击的=》['黑色','20com','中国']
      // 因为要判断 下次哪个按钮可以点击，所以需要重新拼接一个下次可能会点击的按钮组合 去和字典里的作比较
      // btn.name 每一个按钮
      selectedArr[i] = btn.name
      // console.log('selectedArr', selectedArr)
      // console.log('selectedArr[i]', selectedArr[i])
      // 将数组里为undefined或null筛选出去，重新拼接
      const key = selectedArr.filter(item => item).join(spliter)
      // console.log('key', key)
      if (pathMap[key]) {
        btn.disabled = false
      } else {
        btn.disabled = true
      }
    })
  })
}
// 想要获取选中规格的名字
// 得到的结果得保证顺序   [undefined,undefined,undefined][
// ['黑色',undefined,undefined]
// [undefined,'30cm',undefined]
// [undefined,undefined,'中国']
const getSelectedSpec = (specs) => {
  // console.log(specs)
  const arr = []
  specs.forEach((spec, index) => {
    // spec 每一行
    // 一行按钮里 是有一个选中的
    const btn = spec.values.find(obj => obj.selected === true)
    // console.log(btn)
    if (btn) {
      arr[index] = btn.name // index 决定插入的顺序=》每一列选中的是哪个
    } else {
      arr[index] = undefined
    }
  })
  return arr
}
const initDefaultStatus = (goods, skuId) => {
  // 从 skus 中根据 skuId 找到选中sku 项
  const sku = goods.skus.find(item => item.id === skuId)
  // console.log('sku', sku)
  //  需要控制按钮的高亮
  // 遍历每一行按钮
  if (sku.specs) {
    goods.specs.forEach((spec, i) => {
      // 遍历得到每一个按钮
      spec.values.forEach(btn => {
        // 判断哪个按钮名字 和选中的sku按钮名字相同，则是选中状态
        btn.selected = btn.name === sku.specs[i].valueName
      })
    })
  }
}
export { getPathMap, updateDisabledStatus, getSelectedSpec, initDefaultStatus, spliter }
